package com.agileboot.attendance.domain.personnel.db;

import com.agileboot.attendance.domain.personnel.dto.SearchPersonnelDTO;
import com.agileboot.common.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
import org.springframework.util.CollectionUtils;

/**
 * <p>
 * 人员信息表 服务实现类
 * </p>
 *
 * @author agileboot
 * @since 2023-03-14
 */
@Service
@RequiredArgsConstructor
public class AttPersonnelService extends ServiceImpl<AttPersonnelMapper, AttPersonnelEntity> {

    /**
     * 分页查询人员列表
     *
     * @param query 查询参数
     * @return 分页结果
     */
    public Page<AttPersonnelEntity> getPersonnelList(PageQuery<SearchPersonnelDTO> query) {
        Page<AttPersonnelEntity> page = query.buildPage();
        
        // 获取查询条件参数
        SearchPersonnelDTO param = query.getParam();
        List<Long> excludePersonnelIds = param.getExcludePersonnelIds();

        page = lambdaQuery()
            .like(param.getPersonnelName() != null, AttPersonnelEntity::getPersonnelName, param.getPersonnelName())
            .like(param.getPersonnelCode() != null, AttPersonnelEntity::getPersonnelCode, param.getPersonnelCode())
            .eq(param.getSupplierId() != null, AttPersonnelEntity::getSupplierId, param.getSupplierId())
            .eq(param.getStatus() != null, AttPersonnelEntity::getStatus, param.getStatus())
            .eq(param.getLevel() != null, AttPersonnelEntity::getLevel, param.getLevel())
            .notIn(!CollectionUtils.isEmpty(excludePersonnelIds), AttPersonnelEntity::getPersonnelId, excludePersonnelIds)
            .orderByDesc(AttPersonnelEntity::getCreateTime)
            .page(page);

        return page;
    }

    /**
     * 根据供应商ID查询人员数量
     *
     * @param supplierId 供应商ID
     * @return 人员数量
     */
    public long countBySupplierId(Long supplierId) {
        return lambdaQuery()
            .eq(AttPersonnelEntity::getSupplierId, supplierId)
            .count();
    }

    /**
     * 检查人员编码是否重复
     *
     * @param personnelCode 人员编码
     * @param personnelId 人员ID（更新时使用）
     * @return 是否重复
     */
    public boolean isPersonnelCodeDuplicated(String personnelCode, Long personnelId) {
        return lambdaQuery()
            .eq(AttPersonnelEntity::getPersonnelCode, personnelCode)
            .ne(personnelId != null, AttPersonnelEntity::getPersonnelId, personnelId)
            .exists();
    }

    /**
     * 检查身份证号是否重复
     *
     * @param idNumber 身份证号
     * @param personnelId 人员ID（更新时使用）
     * @return 是否重复
     */
    public boolean isIdNumberDuplicated(String idNumber, Long personnelId) {
        return lambdaQuery()
            .eq(AttPersonnelEntity::getIdNumber, idNumber)
            .ne(personnelId != null, AttPersonnelEntity::getPersonnelId, personnelId)
            .exists();
    }

    /**
     * 检查电话号码是否重复
     *
     * @param phoneNumber 电话号码
     * @param personnelId 人员ID（更新时使用）
     * @return 是否重复
     */
    public boolean isPhoneNumberDuplicated(String phoneNumber, Long personnelId) {
        return lambdaQuery()
            .eq(AttPersonnelEntity::getPhoneNumber, phoneNumber)
            .ne(personnelId != null, AttPersonnelEntity::getPersonnelId, personnelId)
            .exists();
    }

    /**
     * 检查电子邮箱是否重复
     *
     * @param email 电子邮箱
     * @param personnelId 人员ID（更新时使用）
     * @return 是否重复
     */
    public boolean isEmailDuplicated(String email, Long personnelId) {
        return lambdaQuery()
            .eq(AttPersonnelEntity::getEmail, email)
            .ne(personnelId != null, AttPersonnelEntity::getPersonnelId, personnelId)
            .exists();
    }
} 